package fun.tan90.device.protocol.demo;

import cn.hutool.core.util.HexUtil;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class TLVDecoder {

    /**
     * TLV解码器（假设T和L各占2字节，大端序）
     *
     * @param data 输入的字节数组
     * @return 解码后的TLV对象列表
     * @throws IllegalArgumentException 数据不完整或格式错误
     */
    public List<Map<String, Object>> decode(byte[] data) {
        List<Map<String, Object>> entries = new ArrayList<>();
        ByteBuffer buffer = ByteBuffer.wrap(data);
        buffer.order(java.nio.ByteOrder.BIG_ENDIAN); // 大端序（高位在前）
        while (buffer.remaining() >= 4) { // 至少需要4字节（T+L）
            // 1. 解析Type（2字节）
            int type = buffer.getShort() & 0xFFFF; // 转为无符号整数

            // 2. 解析Length（2字节）
            int length = buffer.getShort() & 0xFFFF; // 转为无符号整数

            // 检查剩余数据是否足够
            if (buffer.remaining() < length) {
                throw new IllegalArgumentException("数据不完整: 期望长度 " + length + "，实际剩余 " + buffer.remaining());
            }

            // 3. 提取Value
            byte[] value = new byte[length];
            buffer.get(value);
            entries.add(Map.of("key", String.format("%04X", type), "length", length, "value", HexUtil.encodeHexStr(value, false)));
        }
        return entries;
    }
}

